package com.kara.woodAgent.agent.tool;

import com.kara.woodAgent.agent.tool.provider.Tools;
import dev.langchain4j.agent.tool.P;
import dev.langchain4j.agent.tool.Tool;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;

/**
 * @author tzy
 * @version 1.0
 * @project wood_agent
 * @description
 * @date 2025/6/4 13:20:16
 */
@Tools(groups = "file")
@Component
public class FileTools {




	@Tool(name = "createFile", value = "在指定路径下创建文件")
	public String createFile(@P("文件所在的路径") String path) {
		//根据路径创建文件
		//改为远程调用

		//当代返回结果

		File file = new File(path);
		try {
			if (file.exists()) {
				return "文件已存在";
			}
			// 检查并创建父目录
			File parentDir = file.getParentFile();
			if (parentDir != null && !parentDir.exists()) {
				if (!parentDir.mkdirs()) {
					return "创建父目录失败";
				}
			}
			if (file.createNewFile()) {
				return "创建成功";
			}
		} catch (IOException e) {
			return "创建失败，错误信息: " + e.getMessage();
		}
		return "创建失败";
	}


	@Tool(name = "writeFile", value = "在指定路径下写入内容")
	public String writeFile(@P("文件所在路径") String path, @P("要写入的内容") String content, @P("是否是追加写") boolean append) {
		File file = new File(path);
		try {
			// 检查并创建父目录
			File parentDir = file.getParentFile();
			if (parentDir != null && !parentDir.exists()) {
				if (!parentDir.mkdirs()) {
					return "创建父目录失败";
				}
			}

			// 确保文件存在
			if (!file.exists()) {
				if (!file.createNewFile()) {
					return "创建文件失败";
				}
			}

			try (FileWriter writer = new FileWriter(file, append)) {
				writer.write(content);
				return "写入成功";
			}
		} catch (IOException e) {
			return "写入失败，错误信息: " + e.getMessage();
		}
	}


	@Tool(name = "readFile", value = "读取指定路径下文件内容")
	public String readFile(@P("文件所在的路径") String path) {
		// 根据路径读取文件
		File file = new File(path);
		StringBuilder content = new StringBuilder();

		try (java.io.BufferedReader reader = new java.io.BufferedReader(new java.io.FileReader(file))) {
			if (!file.exists()) {
				return "文件不存在";
			}
			if (!file.canRead()) {
				return "没有读取文件的权限";
			}

			String line;
			while ((line = reader.readLine()) != null) {
				content.append(line).append("\n");
			}
			// 移除最后一个换行符
			if (!content.isEmpty()) {
				content.setLength(content.length() - 1);
			}

			if(content.toString().isBlank()){
				return "目标文件内容为空";
			}
			return content.toString();
		} catch (IOException e) {
			return "读取失败，错误信息: " + e.getMessage();
		}
	}


	@Value("${tool.file.delete.scope}")
	private String delScope;

	@Tool(name = "deleteFileOrDirectory", value = "删除指定路径下的文件或文件夹")
	public String deleteFileOrDirectory(@P("文件或文件夹所在的路径") String path) {

		File file = new File(delScope);
		String scopePath = file.getPath();
		File fileOrDirectory = new File(path);
		String delPath = fileOrDirectory.getPath();
		if (!delPath.startsWith(scopePath)) {
			throw new RuntimeException("删除文件或文件夹失败，路径不允许删除");
		}


		try {
			// 检查文件或文件夹是否存在
			if (!fileOrDirectory.exists()) {
				return "指定路径不存在，无法删除";
			}
			// 调用递归删除方法
			if (deleteRecursively(fileOrDirectory)) {
				return "删除成功";
			} else {
				return "删除失败";
			}
		} catch (SecurityException e) {
			// 处理安全异常
			return "删除时发生安全错误，错误信息: " + e.getMessage();
		}
	}

	/**
	 * 递归删除文件或文件夹
	 *
	 * @param fileOrDirectory 要删除的文件或文件夹
	 * @return 删除成功返回 true，失败返回 false
	 */
	private boolean deleteRecursively(File fileOrDirectory) {
		if (fileOrDirectory.isDirectory()) {
			// 列出文件夹内的所有文件和子文件夹
			File[] children = fileOrDirectory.listFiles();
			if (children != null) {
				for (File child : children) {
					// 递归删除子文件和子文件夹
					if (!deleteRecursively(child)) {
						return false;
					}
				}
			}
		}
		// 删除文件或空文件夹
		return fileOrDirectory.delete();
	}

}
